package com.manxi.mall.service.impl;

import com.manxi.mall.bean.TradeProvinceOrderAmount;
import com.manxi.mall.mapper.TradeStatsMapper;
import com.manxi.mall.service.TradeStatsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Addroc
 * @date 2024/6/14
 * 交易域统计Service接口实现类
 * 实现交易相关的各项统计功能
 */
@Service
public class TradeStatsServiceImpl implements TradeStatsService {
    @Autowired
    private TradeStatsMapper tradeStatsMapper;
    
    /**
     * 获取某天总交易额(GMV)
     * @param date 日期参数
     * @return 返回当日总交易额
     */
    @Override
    public BigDecimal getGMV(Integer date) {
        // 调用Mapper查询数据库获取总交易额
        return tradeStatsMapper.selectGMV(date);
    }

    /**
     * 获取某天各个省份交易额
     * @param date 日期参数
     * @return 返回各省份交易额列表
     */
    @Override
    public List<TradeProvinceOrderAmount> getProvinceAmount(Integer date) {
        // 调用Mapper查询数据库获取各省份交易额
        return tradeStatsMapper.selectProvinceAmount(date);
    }
    
    /**
     * 获取某天的订单总数
     * @param date 日期参数
     * @return 返回当日订单总数
     */
    @Override
    public Integer getOrderCount(Integer date) {
        // 调用Mapper查询数据库获取订单总数
        return tradeStatsMapper.selectOrderCount(date);
    }
    
    /**
     * 获取某天的下单用户数
     * @param date 日期参数
     * @return 返回当日下单用户数
     */
    @Override
    public Integer getUserCount(Integer date) {
        // 调用Mapper查询数据库获取下单用户数
        return tradeStatsMapper.selectUserCount(date);
    }
    
    /**
     * 获取某天的平均订单金额
     * @param date 日期参数
     * @return 返回当日平均订单金额
     */
    @Override
    public BigDecimal getAvgOrderAmount(Integer date) {
        // 调用Mapper查询数据库获取平均订单金额
        return tradeStatsMapper.selectAvgOrderAmount(date);
    }
    
    /**
     * 获取某天各时段的交易额分布
     * @param date 日期参数
     * @return 返回各时段(0-23小时)交易额的Map
     */
    @Override
    public Map<Integer, BigDecimal> getHourlyOrderAmount(Integer date) {
        // 调用Mapper查询数据库获取各时段交易额
        List<Map<String, Object>> hourlyAmountList = tradeStatsMapper.selectHourlyOrderAmount(date);
        
        // 将查询结果转换为需要的Map格式
        Map<Integer, BigDecimal> resultMap = new HashMap<>();
        for (Map<String, Object> hourAmount : hourlyAmountList) {
            Integer hour = (Integer) hourAmount.get("hour");
            BigDecimal amount = (BigDecimal) hourAmount.get("order_amount");
            resultMap.put(hour, amount);
        }
        
        return resultMap;
    }
    
    /**
     * 获取某天各支付方式的交易额分布
     * @param date 日期参数
     * @return 返回各支付方式交易额的Map
     */
    @Override
    public Map<String, BigDecimal> getPaymentTypeAmount(Integer date) {
        // 调用Mapper查询数据库获取各支付方式交易额
        List<Map<String, Object>> paymentAmountList = tradeStatsMapper.selectPaymentTypeAmount(date);
        
        // 将查询结果转换为需要的Map格式
        Map<String, BigDecimal> resultMap = new HashMap<>();
        for (Map<String, Object> paymentAmount : paymentAmountList) {
            String paymentType = (String) paymentAmount.get("payment_type");
            BigDecimal amount = (BigDecimal) paymentAmount.get("order_amount");
            resultMap.put(paymentType, amount);
        }
        
        return resultMap;
    }
    
    /**
     * 获取某天各品类的交易额分布
     * @param date 日期参数
     * @return 返回各品类交易额的Map
     */
    @Override
    public Map<String, BigDecimal> getCategoryAmount(Integer date) {
        // 调用Mapper查询数据库获取各品类交易额
        List<Map<String, Object>> categoryAmountList = tradeStatsMapper.selectCategoryAmount(date);
        
        // 将查询结果转换为需要的Map格式
        Map<String, BigDecimal> resultMap = new HashMap<>();
        for (Map<String, Object> categoryAmount : categoryAmountList) {
            String category = (String) categoryAmount.get("category");
            BigDecimal amount = (BigDecimal) categoryAmount.get("order_amount");
            resultMap.put(category, amount);
        }
        
        return resultMap;
    }
    
    /**
     * 获取某天退款金额
     * @param date 日期参数
     * @return 返回当日退款总金额
     */
    @Override
    public BigDecimal getRefundAmount(Integer date) {
        // 调用Mapper查询数据库获取退款总金额
        return tradeStatsMapper.selectRefundAmount(date);
    }
    
    /**
     * 计算某天的转化率
     * @param date 日期参数
     * @return 返回当日转化率(百分比)
     */
    @Override
    public BigDecimal getConversionRate(Integer date) {
        // 获取当日下单用户数
        Integer orderUserCount = getUserCount(date);
        
        // 获取当日访问用户数
        Integer visitUserCount = tradeStatsMapper.selectVisitUserCount(date);
        
        // 计算转化率: (下单用户数 / 访问用户数) * 100%
        if (visitUserCount == null || visitUserCount == 0) {
            return BigDecimal.ZERO;
        }
        
        BigDecimal rate = new BigDecimal(orderUserCount)
                .divide(new BigDecimal(visitUserCount), 4, BigDecimal.ROUND_HALF_UP)
                .multiply(new BigDecimal("100"));
        
        return rate;
    }
}
